package mx.itesm.pruebadmescenas;

import java.io.IOException;
import org.andengine.engine.camera.Camera;
import org.andengine.engine.handler.timer.ITimerCallback;
import org.andengine.engine.handler.timer.TimerHandler;
import org.andengine.engine.options.EngineOptions;
import org.andengine.engine.options.ScreenOrientation;
import org.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy;
import org.andengine.entity.scene.Scene;
import org.andengine.ui.activity.SimpleBaseGameActivity;
import android.os.Bundle;
import android.view.KeyEvent;

/**
 * Esta es la clase principal que representa el juego completo.
 * Aquí se implementa el ciclo de vida de la aplicación (inicio, pausa, detener, destruir)
 * 
 * @author Roberto Martínez Román
 *
 */
public class ProyectoJuego extends SimpleBaseGameActivity
{
	// Dimensiones de la cámara
	public static final int ANCHO_CAMARA = 800;
	public static final int ALTO_CAMARA = 480;
	// La cámara
	private Camera camara;
	
	// Se encarga de cambiar las escenas (diferentes pantallas), la actividad es única
	// pero cambiamos escenas para mostrar "distintas" pantallas.
	private ManejadorEscenas admEscenas;	

	/*
	 * Llamado cuando se crea la actividad.
	 * 
	 * @see org.andengine.ui.activity.BaseGameActivity#onCreate(android.os.Bundle)
	 */
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//setContentView(R.layout.activity_main);
	}

	/*
	 * Define las opciones para el engine.
	 * 
	 * @see org.andengine.ui.IGameInterface#onCreateEngineOptions()
	 */
	@Override
	public EngineOptions onCreateEngineOptions() {
		camara = new Camera(0, 0, ANCHO_CAMARA, ALTO_CAMARA);
		return new EngineOptions(true, 	// pantalla completa (sin títulos ni estado)
				ScreenOrientation.LANDSCAPE_FIXED, // Modo horizontal
				new RatioResolutionPolicy(ANCHO_CAMARA, ALTO_CAMARA), // Mantiene relación ancho/alto
				camara);
	}

	/**
	 * Para cargar los recursos que requiera la aplicación. No se cargan todos en este momento, el Manejador de recursos
	 * lo hará bajo demanda
	 */
	@Override
	public void onCreateResources() throws IOException {

		// Le pasa toda la información al administrador de recursos
		ManejadorRecursos.inicializarManejador(mEngine, this, camara, getVertexBufferObjectManager());
		admEscenas = ManejadorEscenas.getInstance(); // Referencia al objeto
	}

	/**
	 * Define la primera escena que se muestra en pantalla.
	 * 
	 * @see org.andengine.ui.activity.SimpleBaseGameActivity#onCreateScene()
	 */
	@Override
	protected Scene onCreateScene() {
		
		admEscenas.crearEscenaSplash(); // Se crea la primer escena
		admEscenas.setEscena(TipoEscena.ESCENA_SPLASH); // Se pone como escena actual, es la primera que se muestra

		// Programamos la carga de la segunda, después de n segundos
		mEngine.registerUpdateHandler(new TimerHandler(1f,	// Tiempo antes de ejecutar el código
				new ITimerCallback() {
					public void onTimePassed(final TimerHandler pTimerHandler) { 
						// Después de n segundos
						mEngine.unregisterUpdateHandler(pTimerHandler);	// Cancela el timer
						admEscenas.crearEscenaMenu(); // Crea el menu
						admEscenas.setEscena(TipoEscena.ESCENA_MENU); // Ahora muestra el menú
						admEscenas.liberarEscenaSplash();
					}
				}));

		return admEscenas.getEscenaActual(); // La primer escena 
	}
	
	/**
	 * Se ejecuta cuando el usuario oprime alguna tecla
	 */
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if (keyCode == KeyEvent.KEYCODE_BACK) {	// Es el botón de back?
			if ( admEscenas.getTipoEscenaActual()==TipoEscena.ESCENA_MENU ) {
				// Si está en el menú principal, back hace que termine
				finish();	// Termina la aplicación
			} else {
				// si no, la propia escena maneja el evento
				admEscenas.getEscenaActual().onBackKeyPressed();
			}
        }
       // El SO procesa la tecla 
        return false; 
	}
	/**
	 * La aplicación sale de memoria
	 */
	@Override
	protected void onDestroy() {
		super.onDestroy();
		if ( admEscenas!=null ) {
			System.exit(0);	// Termina la aplicación
		}
	}
}
